// 引入需要使用的函数和模块
import { logout, getInfo } from '@/api/acl/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

// 定义获取默认状态的函数
const getDefaultState = () => {
  return {
    token: getToken(), // 使用 getToken 函数获取 token 值
    name: '',
    avatar: '',
    userSn:''
  }
}

// 定义 Vuex 模块的状态
const state = getDefaultState()

// 定义 Vuex 模块的变更操作
const mutations = {
  // 重置状态为默认状态
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  // 设置 token
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  // 设置用户名
  SET_NAME: (state, name) => {
    state.name = name
  },
  // 设置用户头像
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
   // 设置用户头像
   SET_USERSN: (state, userSn) => {
    state.userSn = userSn
  }
}

// 定义 Vuex 模块的异步操作
const actions = {
  // 用户登录
  // 登录 action
  async login({ commit }, token) {
    try {
      // 设置 token
      commit('SET_TOKEN', token);
      // 将 token 值保存在浏览器的本地存储中
      setToken(token);
      // 可以根据需要返回其他数据或状态
      return "ok";
    } catch (error) {
      // 异常时返回一个被拒绝的 Promise 对象
      return Promise.reject(error);
    }
  },
  // 获取用户信息
  async getInfo({ commit }) {
    try {
      // 真实的token获取和验证逻辑
      const token = getToken();
      console.log("获取token",token);
      if (!token){
        throw new Error('token获取失败，请重新登录。')
      }
      // 发送请求获取用户信息
      const response = await getInfo(token);
      console.log("response",response);
      // 如果响应数据不存在，说明验证失败
      if (!response.data) {
        throw new Error('验证失败，请重新登录。')
      }
      // 获取用户名和头像
      const { userName, avatar,userSn } = response.data
      
      // 设置用户名
      commit('SET_NAME', userName)
      // 设置用户头像
      commit('SET_AVATAR', avatar)
      // 设置用户工号
      commit('SET_USERSN', userSn)
      
      return response
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 用户注销
  async Logout({ commit, state }) {
    try {
      // 发送请求注销用户登录状态
      await logout(state.token)
      // 从本地存储中删除 token
      removeToken()
      // 重置路由
      resetRouter()
      // 重置状态
      commit('RESET_STATE')
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 重置 token 值
  async resetToken({ commit }) {
    try {
      // 从本地存储中删除 token
      removeToken()
      // 重置状态
      commit('RESET_STATE')
    } catch (error) {
      return Promise.reject(error)
    }
  }
}

// 导出 Vuex 模块
export default {
  namespaced: true, // 开启命名空间
  state,
  mutations,
  actions
}